#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <mkl.h>
#include <sys/time.h>  // 用于高精度计时

#define N 1024  // 矩阵大小

int n=1024;

// 生成随机矩阵
void generate_random_matrix(double *matrix, int n) {
    for (int i = 0; i < n * n; i++) {
        matrix[i] = (double)rand() / RAND_MAX;  // 生成 [0, 1) 之间的随机数
    }
}

// 打印矩阵（用于调试）
void print_matrix(double *matrix, int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%8.4f ", matrix[i * n + j]);
        }
        printf("\n");
    }
}

// 获取当前时间（高精度）
double get_time() {
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return tv.tv_sec + tv.tv_usec * 1e-6;
}

int main() {
    freopen("data.txt","r",stdin);

    // 分配内存
    double *A = (double *)mkl_malloc(N * N * sizeof(double), 64);
    double *B = (double *)mkl_malloc(N * N * sizeof(double), 64);
    double *C = (double *)mkl_malloc(N * N * sizeof(double), 64);

    if (A == NULL || B == NULL || C == NULL) {
        printf("内存分配失败！\n");
        return 1;
    }

    // 输入矩阵 A 和 B
    for (int i=0;i<N*N;++i)	
    	scanf("%lf",&A[i]);
    for (int i=0;i<N*N;++i)	
    	scanf("%lf",&B[i]);
    	    
    // 初始化矩阵 C 为 0
    for (int i = 0; i < N * N; i++) {
        C[i] = 0.0;
    }

    // 记录开始时间
    double start_time = get_time();

    // 调用 cblas_dgemm 计算矩阵乘法 C = A * B
    cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, N, N, N, 1.0, A, N, B, N, 0.0, C, N);

    // 记录结束时间
    double end_time = get_time();

    // 计算并输出运行时间
    double elapsed_time = end_time - start_time;
    printf("C[0][0] is %lf\n",C[0]);
    printf("MKL矩阵乘法计算时间: %.6f 秒\n", elapsed_time);

    // 释放内存
    mkl_free(A);
    mkl_free(B);
    mkl_free(C);

    return 0;
}
